/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.analisadorSintatico.comandos;

import compilador.analisadorLexico.*;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.classe.DEC_VARIAVEL;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import compilador.analisadorSintatico.simboloGramatical.Terminal;

/**
 *
 * @author  Matheus Cardoso
 * <BLOCO> ::= ‘{‘ { <DEC_VARIAVEL> | <CMD> } ‘}’ | <DEC_VARIAVEL> | <CMD>

 */
public class BLOCO extends Producao{

    @Override
    public SimboloGramatical derivar() throws Exception {
        //chama o token reader para correr os tokens
        TokenReader tokenReader = TokenReader.getInstance();

        Token token = null;

        //instancia o não terminal principal da produção em curso
        
        token = tokenReader.seeCurrent();

        if (token.getTokenClass().equals(TokenClass.DELIMITADOR) && token.getAtributo().equals("{")) {

            tokenReader.consome();//avança index
            ((NaoTerminal) simbolo).add(new Terminal(token)); //adiciona { à árvore           

        } else {// Quando nao ha chave no IF
           if(token.getAtributo().equals(PalavraReservada.CHAR) || token.getAtributo().equals(PalavraReservada.INT)){
                ((NaoTerminal) simbolo).add(new DEC_VARIAVEL().derivar());
                token = tokenReader.seeCurrent();
            
            }else{
                ((NaoTerminal) simbolo).add(new CMD().derivar());
                token = tokenReader.seeCurrent();
            }
            return simbolo;
        }

        token = tokenReader.seeCurrent();
        
        //TODO Refazer decisão entre DEC_VARIAVEL e CMD, ambos podem começar por id @henrique
        while(tokenReader.hasToken() && ! token.getAtributo().equals("}")){
            if(token.getAtributo().equals(PalavraReservada.CHAR) || token.getAtributo().equals(PalavraReservada.INT)){
                ((NaoTerminal) simbolo).add(new DEC_VARIAVEL().derivar());
                token = tokenReader.seeCurrent();
            
            }else{
                ((NaoTerminal) simbolo).add(new CMD().derivar());
                token = tokenReader.seeCurrent();
            }
        }

        token = tokenReader.seeCurrent();
        if (token.getTokenClass().equals(TokenClass.DELIMITADOR) && token.getAtributo().toString().equals("}")) {

            tokenReader.consome();//avança index 
            ((NaoTerminal) simbolo).add(new Terminal(token)); //adiciona } à árvore

        } else {
            erro(this.getClass().getSimpleName()
                    + "mal formado - '}' não encontrado");
        }

        return simbolo;
    }

    @Override
    public void setSimbolo() {
        simbolo = new NaoTerminal(this.getClass().getSimpleName());
    }

   

}
